#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QDesktopServices>
#include <QMainWindow>
#include <QWebSocket>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QDate>
#include <QTimer>
#include <QUuid>
#include <QDebug>
#include <QUrl>
#include <QIntValidator>
#include <QSystemTrayIcon>
#include <QStyle>
#include <QApplication>
#include <algorithm>
#include <QMessageBox>
#include <QCloseEvent>
#include <QClipboard>
#include <QGroupBox>
#include <QFormLayout>

#include "dbmanager.h"
#include "gamesession.h"
#include "server.h"
#include "config.h"
#include "entities.h"

#ifdef DEV_BUILD
#define LEADERBOARD_CS_URL "http://localhost:5173" // cs排行榜地址本地测试
#else
#define LEADERBOARD_CS_URL "http://1.95.36.193:5174"        // cs排行榜地址本地测试
#endif


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE


// 消息通知枚举
enum class NotificationType {
    Information,
    Warning,
    Critical,
    Question
};

// 返回主播信息的结构体
struct AnchorInfo {
    bool exists;       // 主播是否存在
    QString id;        // 主播id
    QString name;      // 主播名称
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void connectionListening();

signals:
    void processNum();

protected:
    void closeEvent(QCloseEvent *event);

private:
    void initUi();
    void set_gift(int gameId = 0);
    void set_Uuid();
    AnchorInfo findAnchorInfo(const QString &anchorId);

public slots:
    void on_message_receive(const QString &message);
    void do_send_codes_fail(const QString& errInfo);
    void do_player_join(const QString &user_nickname, const QString & user_id);
    void on_clearPopover_clicked();
    void do_showTempNotification(const QString& title, const QString& message, NotificationType type, int duration);
    void do_showRankingBut_clicked();
    void do_pushButton_clicked(const QString &userId, const QString &sortValue);
    void hideWidgets(); // 隐藏ui
    void hideAllWidgets(QLayout* layout);
    void adjustWindowSize();

private slots:
    void do_rebootGameBtn_clicked();
    void do_startGameBtn_clicked();

    void on_likeBtn_clicked();
    void on_danMuBtn_clicked();
    void on_giftButton_clicked();

    void on_selectGame_comboBox_activated(int index);
    void on_showOverallRankingBut_clicked();
    void on_showCurrentRankingBut_clicked();
    void do_openLeaderboard_cs(); // 1、打开 cs 排行榜
    void do_showLeaderboard_cs(const int& team, const QVector<QString>& playerNames); // 2、显示 cs 排行榜

    void on_joinRobotBtn_clicked();

    void on_openWinAppBtn_clicked();    // 复制弹窗地址
    void on_copyGameUiBtn_clicked();    // 复制游戏ui地址
    void on_addPlayer_clicked();    // 添加玩家
    void on_delPlayer_clicked();    // 删除玩家
    void on_clearUI_clicked();

    void on_letfWinBtn_clicked();   // 左弹窗
    void on_rightWinBtn_clicked();  // 右弹窗
    void on_leftGift_btn_clicked(); // 左礼物按钮点击
    void on_rightGift_btn_clicked();// 右礼物按钮点击

    void do_show_win_byXinji(const QString& player_name, const QString& player_HeadImgUrl, const QString& team, const QString& content);
    void do_show_gift_byXinji(const QString& player_name, const QString& player_HeadImgUrl, const QString& team, const QString& content);
    void on_password_Input_textChanged(const QString &arg1);

    void on_killBroadcast_clicked();
    void on_clearBroadcast_clicked();

    void on_testWebBtn_clicked();

private:
    Ui::MainWindow *ui;
    QTimer *m_timer;                // 定时器，用来定时连接弹幕监听软件
    QTimer* m_inputDebounceTimer;   // 用来主播输入ID时防抖
    QWebSocket *m_webSocket;
    DBManager *m_db;
    GameSession *m_gameSession;     // 这个类与游戏会话（Session）相关，比如管理玩家、分数等。
    WebSocketServer m_server;
    bool m_isClosing;               // 延迟关闭窗口变量
};
#endif // MAINWINDOW_H
